#网络爬虫是一种非常普遍的东西
#网络爬虫又叫做网络蜘蛛
#蜘蛛从索引区出发去爬取网页，将爬取的网页放到临时库中，如果没有将信息爬取完整那么就要进行一个循环。对于临时库中的信息，如果符合规则就会产生一个索引，在索引区中进行分类、
#归档、排序、然后将结果返回给用户。

'''
准备工作：产看目标网页
获取数据：通过HTTP库向目标站点发起请求，请求可以包含二外的header等信息，比如服务器是否能正常相应，会得到一个Response，便是要获取的页面信息
解析内容：得到的内容可能是HTML、json等格式，可以用页面解析库，正则表达式等进行解析
保存数据：保存形式多样，可以存为文本，也可以爆粗到数据库，或者保存特定格式的文件
CSS
'''

'''
User-Agent表明是一个什么版本的浏览器
Cookie如果是需要登录，需要知道怎么去存储他可读取他

'''
'''
在第一行中加入# -*-coding:uft-8-*-或者#coding=utf-8   来保证文字在中文处理上是正确的
在Python中可以使用函数实现单一功能或相关联功能的代码段，可以提高可读行和代码的重复利用率，函数代码块以def关键字开头，后接空格、函数标识符名称、圆括号、冒号
return用于结束函数，可以返回一个值，也可以不带任何表达式
Python文件中可以加入main函数用于测试程序   if__name__=="__main__":
'''
'''
def main(a):
    print("hello")
#main(2)  #先执行这个后执行下面这个，但是要控制在一个流程中 
if __name__=="__main__":
    main(1)
    #调用函数,能够更加清晰的控制多个函数的流程和关系，如果采用正常的函数调用，由于他们之间是同级的关系，不好判断流程
'''
'''
#引入模块
'''
from bs4 import BeautifulSoup  #负责网页解析，获取数据
import re   #正则表达式，负责文字匹配
import urllib.request,urllib.error   #制定url，获取网络数据
import xlwt  #进行excel操作
import sqlite3   #进行SQLite数据库操作

def main():
    baseurl= "https://movie.douban.com/top250?start="
    #1.爬取网页
    datalist = getData(baseurl)
    savepath = r"./豆瓣电影Top250.xls"#.表示当前文件夹/表示当前的一个位置，xls表示的是excel文件的格式
    #3.保存数据
    #saveData(savepath)
    #需要三个功能，一个功能一个函数
    #askURL(baseurl)




#爬取网页
def getData(baseurl):
    datalist = []
    for i in range(0,10):#左闭右开,调用页面信息的函数
        url = baseurl + str(i*25)
        html = askURL(url) #保存获取到的网页源码
        # 2.逐一解析数据，一个网页一个网页进行解析，因为html会被覆盖
        soup = BeautifulSoup(html,"html.parser")#解析html文件，用的是html.parser方法
        for item in soup.find_all('div',class_="item"):
            # 查找符合要求的字符串，形成列表,要的是div但是里面的属性是class=item
            #已经将一小节提取出来了
            print(item)
    return datalist


#得到指定一个URL的网页内容
def askURL(url):#需要被调用25次
    #模拟浏览器头部信息，想豆瓣服务器发送信息
    head = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55"
    }
#用来伪装用的，用户代理表示告诉豆瓣，服务器我们是什么类型的机器、浏览器，本质上是告诉浏览器我们可以接受什么水平的文件内容


    request = urllib.request.Request(url,headers = head)#yong Request进行封装
    html= " "  #进行存储
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")#read可以读取出相应的内容，decode防止格式问题

    except urllib.error.URLError as e:
        if hasattr(e,"code"):#判断e这个对象里面是否包含code这个属性，hasattr这个函数就是判断对象是否包含的对应的属性
            print(e.code)#在这里URLError的code成员被奴熬到了HTTPError里面了，e.code可能会报错？？？
        if hasattr(e,"reason"):
            print(e.reason)
        return html
#因为由调用，所以需要返回值


#3.保存数据

def saveData (savepath):
    pass
#函数里面应该写至少一句可执行代码
#保存一个路径
if __name__=="__main__":
    main()
